我正在学习C++入门(第5版),虽然到目前为止它确实是很棒的Material,但我发现在某些情况下我会遇到令人头疼的解释,这些解释给我的问题多于答案。在当前示例中(用粗体强调我的):Unlikeotherfunctions,inlineandconstexprfunctionsmaybedefinedmultipletimesintheprogram.Afterall,thecompilerneedsthedefinition,notjustthedeclaration,inordertoexpandthecode.However,allofthedefinitionsofagiven
假设我有以下代码:structFoo{voidhelper(){...}voidfast_path(){...;helper();...}voidslow_path1(){...;helper();...}voidslow_path2(){...;helper();...}};fast_path()方法对性能至关重要,因此应尽一切(合理的)努力使其尽可能快。slow_path1()和slow_path2()方法不是性能关键。根据我的理解,典型的编译器可能会查看此代码并决定不内联helper()如果它足够复杂,以减少总指令大小,如helper()在多个方法函数之间共享。如果慢速路径方法不
Section16.4ofC++FAQs(2ndEdition)(Paperback)byMarshallP.Cline,GregLomow表示内联函数无法安全地访问静态数据成员,因为可以在初始化静态数据成员之前调用该函数。我不明白为什么这适用于内联函数,而不仅仅是其他翻译单元中调用另一个翻译单元中的静态数据成员的函数?我看不出“内联”在这场灾难中起什么作用? 最佳答案 static变量在执行同一翻译单元(或多或少的cpp文件)中的任何函数之前完全初始化。如果main在不同的翻译单元中,它们不能保证在调用main之前被初始化。inl
考虑以下代码:constinta=0;conststd::stringb="hi";inlinevoidf_a1(){std::cout假设此代码存在于将包含在多个翻译单元中的头文件中。我对内联函数的理解是它们在每个翻译单元中必须完全相同。我对上面使用的常量的理解是,它们是隐含的static,即内部链接。这意味着每个翻译单元都有自己的拷贝。由于上面的内联函数依赖于这些常量,如果有的话,这些函数中哪些是正确的? 最佳答案 如果包含在多个翻译单元中,则唯一有效的函数是f_a1。相关子句是[basic.def.odr]/6,其中声明inl
如果您在编译器中启用了完全优化并设置了如下类:classA{voidDo_A_Stuff();};classB{Aa;voidDo_B_Stuff(){a.Do_A_Stuff();}};classC{Bb;voidDo_C_Stuff(){b.Do_B_Stuff();}};classD{Cc;voidDo_D_Stuff(){c.Do_C_Stuff();}};是否存在调用Do_D_Stuff()比直接调用Do_A_Stuff()慢的情况?此外,这是否需要在每个包装器“链”上使用inline关键字,或者,由于这只是一个建议,编译器是否可以决定在没有关键字的情况下对其进行优化?我知道
我们都知道内联函数会使调试变得更加棘手,因为它们可以从堆栈跟踪等中删除。但是假设我想从gdb中调用一个内联函数,并且我知道它的名称和参数。我认为我应该能够做到这一点,但我明白了:Cannotevaluatefunction--maybeinlined我用nm列出了我正在使用的共享库中的符号,发现我要调用的函数不在里面。没什么大惊喜。我想要的是一种生成这些内联函数的可见定义的方法。我可以访问当前包含内联定义的头文件,但我无法真正修改这些头文件。也许有某种方法可以告诉编译器发出它在翻译单元中看到的所有内联函数的定义?或者其他一些可以更轻松地在gdb中调用和检查内联函数结果的技巧?我在Lin
如果它们是内联的,我就能理解它是如何工作的。但如果不是,它是如何工作的?是否所有目标文件都有自己的拷贝,例如函数模板? 最佳答案 模板将按照inline的标准含义进行内联,这与OneDefinitionRule的关系比与实际代码内联的关系更大。也就是说,如果模板函数在多个翻译单元中定义,链接器不会提示,它只会选择一个(注意:随机一个,如果您在不同翻译单元中提供模板的不同定义,当前编译器不会提示!)并将其保留在最终的二进制文件中。现在,与所有其他inline函数一样,编译器可以决定实际避免函数调用并在调用位置内联函数是个好主意,或者它
我正在尝试定义一个非常简单的异常类。因为它太简单了,所以我只想将它保留在.h文件中,但编译器不喜欢throw()。代码:#include#includeclassPricingException:publicvirtualstd::exception{private:std::stringmsg;public:PricingException(std::stringmessage):msg(message){}constchar*what()constthrow(){returnmsg.c_str();}~PricingException()throw(){}};GCC给出以下错误:/
我总是尝试将实现保持在header之外,因此对于模板和内联函数,我通常会这样做//File.hinlineboolfoo()#include"File.hpp"//File.hppinlineboolfoo(){return1;}我的问题是,对于函数的实际实现重复inline关键字,C++规范有什么规定?(如本例所示)我真的不想这样做,因为它会因为很多函数而变得困惑,虽然我的编译器没有提示,但我想知道编译器是否仍然接受内联提示。有人知道吗? 最佳答案 我倾向于将inline放在尽可能远离接口(interface)的地方,因为它是一个
我想使用std::stringstream创建格式化字符串,但使用内联类所以我没有stringstream局部变量飞来飞去。我的意思是:#include#include#include#includeintmain(intargc,char*argv[]){std::stringtest=((std::ostringstream&)(std::ostringstream("")这在GCC中编译得很好,但是输出如下:"0x401d0a50.1abc"看来stringstream将第一个字符串视为指针并输出地址。后续operator的工作正常。我该如何解决这个问题?谢谢!